home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / lib2to3 / fixes / fix_next.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  3.4 KB  |  80 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''Fixer for it.next() -> next(it), per PEP 3114.'''
  5. from pgen2 import token
  6. from pygram import python_symbols as syms
  7. from  import fixer_base
  8. from fixer_util import Name, Call, find_binding
  9. bind_warning = 'Calls to builtin next() possibly shadowed by global binding'
  10.  
  11. class FixNext(fixer_base.BaseFix):
  12.     PATTERN = "\n    power< base=any+ trailer< '.' attr='next' > trailer< '(' ')' > >\n    |\n    power< head=any+ trailer< '.' attr='next' > not trailer< '(' ')' > >\n    |\n    classdef< 'class' any+ ':'\n              suite< any*\n                     funcdef< 'def'\n                              name='next'\n                              parameters< '(' NAME ')' > any+ >\n                     any* > >\n    |\n    global=global_stmt< 'global' any* 'next' any* >\n    "
  13.     order = 'pre'
  14.     
  15.     def start_tree(self, tree, filename):
  16.         super(FixNext, self).start_tree(tree, filename)
  17.         n = find_binding('next', tree)
  18.         if n:
  19.             self.warning(n, bind_warning)
  20.             self.shadowed_next = True
  21.         else:
  22.             self.shadowed_next = False
  23.  
  24.     
  25.     def transform(self, node, results):
  26.         if not results:
  27.             raise AssertionError
  28.         base = results.get('base')
  29.         attr = results.get('attr')
  30.         name = results.get('name')
  31.         mod = results.get('mod')
  32.         if base:
  33.             if self.shadowed_next:
  34.                 attr.replace(Name('__next__', prefix = attr.get_prefix()))
  35.             else:
  36.                 base = [ n.clone() for n in base ]
  37.                 base[0].set_prefix('')
  38.                 node.replace(Call(Name('next', prefix = node.get_prefix()), base))
  39.         elif name:
  40.             n = Name('__next__', prefix = name.get_prefix())
  41.             name.replace(n)
  42.         elif attr:
  43.             if is_assign_target(node):
  44.                 head = results['head']
  45.                 return None
  46.             attr.replace(Name('__next__'))
  47.         elif 'global' in results:
  48.             self.warning(node, bind_warning)
  49.             self.shadowed_next = True
  50.         
  51.  
  52.  
  53.  
  54. def is_assign_target(node):
  55.     assign = find_assign(node)
  56.     if assign is None:
  57.         return False
  58.     for child in assign.children:
  59.         if child.type == token.EQUAL:
  60.             return False
  61.         if is_subtree(child, node):
  62.             return True
  63.     
  64.     return False
  65.  
  66.  
  67. def find_assign(node):
  68.     if node.type == syms.expr_stmt:
  69.         return node
  70.     if node.type == syms.simple_stmt or node.parent is None:
  71.         return None
  72.     return find_assign(node.parent)
  73.  
  74.  
  75. def is_subtree(root, node):
  76.     if root == node:
  77.         return True
  78.     return []([ is_subtree(c, node) for c in root.children ])
  79.  
  80.